import route_tools from './route_tools'
import runModules from './runModules'
import controRoute from '../kernel/route/controRoute';
import { ctx } from './inter';
import { IncomingMessage, ServerResponse } from 'http';
import CtxModel from '../model/CtxModel';

// 每一次访问的入口文件
export default async (req:IncomingMessage,res:ServerResponse)=>{
  let ctx:ctx,endRequest:any;
  
  // 封装 ctx上下文对象
  ctx = new CtxModel(req,res);

  endRequest = (data:any = "")=>{
    //发送结果
    ctx.body(data,true);
    // 执行请求
    endRequest.record && endRequest.record(data);
  };
  // 执行顺序  记录请求  >>> 扩展  >>> [解析参数 >>> 全局中间件 >>> 目标路由] >>> 记录请求 
  try{

    //设置默认类型为utf-8
    res.setHeader("Content-Type", "text/html; charset=utf-8");
    
    // 记录请求
    endRequest.record = await runModules(ctx,controRoute.getSpecialRoute("requestRecord"))
    
    // 先执行扩展 扩展不能拦截数据,只有报错的时候才会被拦截
    //调用中间件,接受返回结果
    let content =  await runModules(ctx,await route_tools.getRoute(ctx))
      // 最终结束请求
    endRequest(content)
  }catch(err){
    console.log([err.message])
    console.log([err])
    ctx.$res.statusCode = 500;
    //流程出现异常直接结束请求
    endRequest(err);
  }
}